\chapter{数据库系统}

\section{数据库基本概念}

\textbf{1. 数据：}存储的基本对象， 记录是计算机表示的和存储数据的一种格式或方法

\textbf{2. 数据库：}长期存储在计算机中有组织、可共享的大量数据的集合。特点是永久存储、有组织、可共享

\textbf{3. 数据库系统：}计算机引入数据库后的系统。特点：相互关联的数据集合，较少的数据冗余（关系规范化，程序与数据相互独立，数据安全可靠，保证数据正确性

\textbf{4. 数据独立性：}应用程序不依赖于特定物理表示。逻辑独立性是信息内容变化不影响应用程序，物理独立性是物理存储位置/结构不影响应用程序

\section{数据模型}

\textbf{1. 数据模型：}对现实数据的模拟。分为概念层数据模型和组织层数据模型。

\textbf{2. 概念层数据模型：}抽象实体及实体间的关联关系，常见的有（实体-联系）E-R模型。

\textbf{3. E-R模型：}把实体写在框内，属性写在圆角矩形内，联系写在菱形内。用连线将联系与关联的实体连接。

\textbf{4. 组织层数据模型：}以数据的组织方式描述信息。常见的为关系模型。

\textbf{5. 关系模型：}用二维表（关系）组织数据，关系数据库是关系的集合。关系中的行称为记录（元组），列称为属性。关系模型中的主要操作是增删改查，用行、列唯一确定数据。

\textbf{6. 主码：}关系中用于唯一确定一个元组的最小属性组。可作为关系主码的所有属性称为候选码。

\textbf{7. 数据完整性约束：}实体完整性、参照完整性和用户定义完整性。

\quad（1）实体完整性：所有关系必须有主码，不允许记录无主码或主码相同。

\quad（2）参照完整性：关系中某属性的取值受其它关系约束，用外码实现。

\quad（3）用户定义完整性：针对实际应用定义的数据约束条件

\textbf{8. 数据库系统的结构：}三级模式结构，分为外模式、概念模式和内模式

\quad（1）内模式：数据的物理存储方式

\quad（2）概念模式：数据的逻辑结构和关联关系

\quad（3）外模式：特定用户感兴趣部分的局部描述

\section{SQL语言}

\textbf{1. SQL：}关系数据库管理系统的标准语言

\quad（1）数据定义：CREATE，DROP， ALTER

\quad（2）数据查询：SELECT，FROM，WHERE，HAVING等

\quad（3）数据操作：INSERT，UPDATE，DELETE

\quad（4）数据控制：GRANT，REVOKE，DENY

\textbf{2. 数据类型：}int，numeric，decimal，float，char，varchar，text，datetime

\textbf{3. 关系定义：}
\begin{lstlisting}[language=SQL]
    CREATE TABLE 表名（
    列名 数据类型 完整性约束，
    列名 数据类型 完整性约束...）
\end{lstlisting}

\textbf{4. 完整性约束：}常见的有NOT NULL（限定非空），DEFAULT（默认值），UNIQUE（不能重复），CHECK（不等式约束），主码约束和外码约束

\quad（1）主码约束：PRIMARY KEY， 指定当前属性为主码；或单独列出，PRIMARY KEY（列名）

\quad（2）外码约束： FOREIGN KEY（列）只能单独列出，FOREIGN KEY（列名） REFERENCES 参照表名（参照列名）。参照列名必为主键或有UNIQUE约束

\quad（3）不等式约束：CHECK(逻辑表达式)

\textbf{5. 关系删除：} DROP TABLE 表名

\textbf{6. 关系修改：}ALTER TABLE 表名 ，在其后加入要改的内容。

\quad（1）修改列定义：ALTER COLUMN 列名 新数据类型 

\quad（2）加一列：ADD 列名 数据类型 完整性约束

\quad（3）删一列：DROP 列名

\section{数据查询}

\textbf{1. 基本结构：} SELECT FROM WHERE GROUP BY HAVING ORDER BY

\textbf{2. 单表查询：}
\begin{lstlisting}[language=SQL]
    SELECT 列名 AS 别名  
    FROM 表名 
    WHERE 筛选条件    
\end{lstlisting}

\quad（1）去重： SELECT DISTINCT $\cdots$

\quad（2）区间筛选： WHERE 列名 BETWEEN 上限 AND 下限

\quad（3）集合筛选： WHERE 列名 IN {$\cdots$}

\quad（4）字符串匹配筛选：WHERE 列名 LIKE '$\cdots$'。\_匹配1个字符，%匹配多个字符，[$\cdots$]匹配括号中的任意一个字符，[^$\cdots$]不匹配括号中的任意一个字符

\quad（5）筛选空值： WHERE 列名 IS NULL

\quad（6）多重条件筛选：WHERE ($\cdots$ OR $\cdots$) AND $\cdots$

\quad（7）查询结果排序：ORDER BY 列名 （ASC/DESC)

\quad（8）聚合函数： SELECT f(列名) AS 别名。可选用COUNT，SUM，AVG，MAX，MIN等。

\quad（9）分组统计：GROUP BY 列名 HAVING 组筛选条件

\quad（10）取前n行数据：SELECT TOP n {WITH TIES} 列名

\quad（11）CASE表达式：SELECT 表名 CASE 值1 THEN 别名1 CASE 值2 THEN 别名2$\cdots$

\textbf{3. 多表连接查询：}SELECT 列名 FROM 表1 INNER JOIN 表2 ON 筛选条件。为表取别名可实现自连接，即表1、表2为同一张表

\textbf{4. 子查询：}将另一个查询结果嵌套在查询条件中。SELECT 列名 FROM 表名 WHERE 表达式 IN（子查询） 。存在性测试中， WHERE EXISTS（子查询）

\section{其它数据操作}

\textbf{1. 插入数据：} INSERT INTO 表名 VALUES (属性值)

\textbf{2. 更新数据：} UPDATE 表名 SET 列名 = 表达式 {WHERE 筛选条件}

\textbf{3. 删除数据：} DELETE FROM 表名 {WHERE  筛选条件}

\textbf{4. 查询结果保存：} SELECT 列名 INTO　新表名

\section{视图}

\textbf{1. 概念：}查询语句产生的结果，有别名和列名。

\textbf{2. 创建视图：}CREATE VIEW 视图名 AS SELECT$\cdots$

\textbf{3. 修改视图：}ALTER VIEW 视图名 AS SELECT$\cdots$

\textbf{4. 删除视图：}DROP VIEW 视图名

\textbf{5. 索引：}表中所包含值的列表，用来加快数据的查询速度。CREATE {CLUSTERD} INDEX 索引名 ON 表名(列名)

\section{规范化理论}

\textbf{1. 函数依赖：}某一属性的取值依赖于另一属性。若两条记录的X相同能推出Y相同，则称X决定Y，Y依赖于X。

\quad（1）完全依赖：X中任意去掉一个属性都不能唯一决定Y

\quad（2）部分依赖：X中某一子集可决定Y

\quad（3）传递依赖：若Z依赖于Y且Y依赖于X，则称Z传递依赖于X

\textbf{2. 关系规范化：}将有错误函数依赖的关系模式转化为良好关系模式

\quad（1）候选码：决定关系中全部属性值的最小属性组

\quad（2）主码：关系中用于唯一表示记录的属性组

\quad（3）外码：用于建立关系表间关联关系的属性组

\textbf{3. 范式：}关系所满足的不同程度要求，包括1NF、2NF和3NF。

\quad（1）第一范式：不包含重复组的关系。把所有数据项都拆成不可再分的最小属性，可将关系转化为1NF

\quad（2）第二范式：在1NF基础上，每个非主属性都完全依赖于主码。去掉部分依赖的方法是将主码的所有子集单独拎出作为新关系的主码，将属性以完全依赖某一主码为标准归类，最后去掉只有主码的关系

\quad（3）第三范式：在2NF基础上，所有非主属性都不传递依赖于主码。去掉传递依赖的方法是将传递的中间属性单独取出，作为新关系的主码，再将依赖于它的所有属性从原关系移至新关系

\section{数据库保护}

\textbf{1. 事务：}完整的工作单元，全部执行或都不执行。

\quad（1）原子性：事务是数据库的逻辑工作单位，不可部分执行

\quad（2）一致性：事务执行的不能使数据库变为不一致状态

\quad（3）隔离性：事务的执行不能被其它事务干扰

\quad（4）持久性：事务成功执行后，数据库被永久改变

\textbf{2. 并发操作：}同时运行的多个事务。

\quad（1）丢失修改：另一个事务覆盖了当前事务提交结果

\quad（2）脏数据：读取了另一事务撤销前的数据

\quad（3）不可重复读：由于另一事务修改，前后读取数据不一致

\quad（4）幽灵数据：由于另一数据修改，读取时多了/少了部分记录

\textbf{3. 并发控制：}合理调度并发操作，使一个事务的执行不受其它事务干扰

\quad（1）共享锁（S锁）：将数据标记为只读。其它事务可以继续加S锁，但不能加X锁，直到当前S锁被释放

\quad（2）排它锁（X锁）：允许当前事务读取和修改数据，但其它事务不能加任何锁或进行任何操作，只能进入等待状态

\textbf{4. 封锁协议：}为数据加锁的规则

\quad（1）一级封锁协议：对数据加X锁，直到当前事务结束才释放。可防止修改，且保证事务可恢复

\quad（2）二级封锁协议：一级封锁协议基础上，对读取的数据加S锁，读完后即释放。可防止读“脏数据”

\quad（3）三级封锁协议：一级封锁协议基础上，对读取数据加S锁，事务结束后才释放。可保证数据可重复读取。

\textbf{5. 数据库备份：}对数据进行复制，保证故障后数据可恢复。应备份表、用户、全部数据和数据库日志。

\textbf{6. 数据库恢复：}将数据库从错误描述状态恢复到最近的正确状态。恢复方法有数据备份、事务日志、镜像技术。

\section{数据库设计}

\textbf{1. 步骤：}需求分析、结构设计（概念、逻辑、物理）、行为设计（功能、事务、程序）、数据库实施、运行和维护阶段。

\textbf{2. 结构设计：}概念结构设计+逻辑结构设计。

\quad（1）概念结构设计：自底向上。先将数据抽象为实体和属性，用E-R图表达实体间的关联关系，再集成为全局E-R图。

\quad（2）逻辑结构设计：将E-R图转化为关系表。之后根据函数依赖关系，对数据模型优化，并设计用户的外模式。

\textbf{3. 行为设计：}功能分析、功能设计、事务设计。

\quad（1）功能分析：指出对实体的操作，并给出语义约束

\quad（2）功能设计：设计各功能模块

\quad（3）事务设计：输入设计、输出设计等